/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package xmlaufgabe3;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

/**
 * Controller nach MVC Pattern. Bearbeitet den Input der Views und leitet diesen an
 * das Model zur Weiterverarbeitung weiter.
 * 
 * @author Adrian Cieluch
 * @version 1.0, 11/3/11
 */
public class InputController implements ActionListener {
    /**
     * Speichert AccountViews
     */
    private ArrayList<AccountView> accountViews;
    
    /**
     * Speichert AccountModel
     */
    private AccountModel model;
    
    /**
     * Macht dem Controller Views und Model bekannt.
     * 
     * @param a Views
     * @param m Model
     */
    public InputController(ArrayList<AccountView> a, AccountModel m) {
        accountViews = a;
        model = m;
        
        for(int i = 0; i < accountViews.size(); i++) {
            accountViews.get(i).addInputActionListener(this);
        }
    }

    /**
     * Bearbeitet den Input der Views.
     * 
     * @param e Uebergebenes Event
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        handleAccountInput();
    }
    
    /**
     * Prueft den Input der Views auf strukturelle Richtigkeit und veraendert bei
     * Erfolg das Model.
     */
    private void handleAccountInput() {
        String regexp = "[0-9]+\\.?[0-9]{0,2}";
        
        for(int i = 0; i < accountViews.size(); i++) {
            if(!accountViews.get(i).getDepositInput().equals("")) {
                if(accountViews.get(i).getDepositInput().matches(regexp)) {
                    model.depositAccountByID(accountViews.get(i).getAccountID(),
                            Double.parseDouble(accountViews.get(i).getDepositInput()));
                    accountViews.get(i).clearDepositInput();
                } else {
                    printErrorMessage();
                }
            }
            
            if(!accountViews.get(i).getWithdrawalInput().equals("")) {
                if(accountViews.get(i).getWithdrawalInput().matches(regexp)) {
                    if(model.getAccountBalanceByID(accountViews.get(i).getAccountID()) < Double.parseDouble(accountViews.get(i).getWithdrawalInput())) {
                        System.out.println("Konto kann nicht ueberzogen werden.");
                    } else {
                        model.withdrawAccountByID(accountViews.get(i).getAccountID(),
                            Double.parseDouble(accountViews.get(i).getWithdrawalInput()));
                        accountViews.get(i).clearWithdrawalInput();
                    }
                } else {
                    printErrorMessage();
                }
            }
        }
    }
    
    /**
     * Gibt eine Fehlermeldung bei falscher Eingabe aus.
     */
    private void printErrorMessage() {
        System.out.println("Es koennen nur rationale Zahlen eingegeben werden.");
    }
}
